import random

class Shop:
    def __init__(self, shop_id, name, price, stock):
        self.shop_id = shop_id
        self.name = name
        self.price = price
        self.stock = stock

    def __str__(self):
        return "商品编号:%d 商品名称:%s 商品价格:%d 库存:%d" % (self.shop_id, self.name, self.price, self.stock)


class Coupon:
    def __init__(self, name, shop_id, discount, type):
        self.shop_id = shop_id
        self.name = name
        self.discount = discount
        self.type = type

    def __str__(self):
        if self.type == 'discount':
            return "优惠券名称:%s 商品编号:%d 折扣:%d" % (self.name, self.shop_id, self.discount)
        else:
            return "优惠券名称:%s 商品编号:%d 减价:%d" % (self.name, self.shop_id, self.discount)

# 打印首页
def print_main(_money,_coupon_cart):
    print("###########################")
    print("#                         #")
    print("#    欢迎使用网上购物系统     #")
    print("#    当前优惠券：           #" )
    index = 1
    for item in _coupon_cart:
        print("#    %d. %s          #"%(index,item.name))
        index += 1
    print("#    当前余额： %d          #" % _money)
    print("#    请按以下提示进行操作     #")
    print("#    1 : 查看购物车         #")
    print("#    2 : 购物              #")
    print("#    3 : 结账              #")
    print("#    0 : 退出系统           #")
    print("#                         #")
    print("###########################")
    operation = input("请输入要操作的序号: ")
    return operation


# 打印购物车列表
def print_shopping_cart(_shopping_cart,_shop_list):
    # 判断购物车是否为空
    if _shopping_cart:
        print("###########################")
        print("#                         #")
        print("#         当前购物车        #")
        for item in _shopping_cart:
            print("#      商品:%s 价格:%d 数量:%d      #" % (item.name, item.price, item.stock))
        print("#                         #")
        print("###########################")
        oper = input("按1键进行退款，按其他键返回上一级\n")
        if oper == '1':
            print("###########################")
            print("#                         #")
            print("#         当前购物车        #")
            for item in _shopping_cart:
                print("#  序号:%d 商品:%s 价格:%d 数量:%d   #" % (item.shop_id,item.name, item.price, item.stock))
            print("#                         #")
            print("###########################")
            item_id = input("请输入要退款的商品序号(0:返回上一级): ")
            if item_id != '0':
                _shop = {}
                for e in _shopping_cart:
                    if e.shop_id == int(item_id):
                        _shop = e
                _count = int(input("请输入退款数量: "))
                if _count > _shop.stock:
                    print("退款失败,退款数量超出购买数量")
                    input("按任意键返回上一级\n")
                    return
                return_to_shop_cart(_shopping_cart,_shop_list,_count,_shop)

    else:
        print("###########################")
        print("#                         #")
        print("#         当前购物车        #")
        print("#            空           #")
        print("#                         #")
        print("###########################")
        input("按任意键返回上一级\n")



# 打印商品列表
def print_shop_list(_shop_list):
    # 列出商品列表
    print("#######################################")
    print("#                                     #")
    print("#                当前商品               #")
    for item in _shop_list:
        print("#   序号:%d  商品名称: %s  商品价格: %d  库存: %d   #" % (
            item.shop_id, item.name, item.price, item.stock))
    print("#                                     #")
    print("#######################################")
    item_id = input("请选择要购买的商品序号(0:返回上一级): ")
    return item_id


# 抽取优惠券
def extract_coupons(_coupon_list, _coupon_cart):
    import random
    coupon = random.choice(_coupon_list)
    _coupon_cart.append(coupon)


# 退出系统
def print_exit():
    print("###########################")
    print("#                         #")
    print("#   欢迎下次光临网上购物系统   #")
    print("#                         #")
    print("###########################")

# 加入购物车
def add_to_shop_cart(_shop_list,_shop, _shop_cart, _count):
    # 判断购物车是否有当前商品
    commodity = False
    for item in _shop_cart:
        if item.shop_id == _shop.shop_id:
            item.stock = item.stock + _count
            commodity = True
    # 加入购物车
    if not commodity:
        # 如果没有当前商品
        _shop_cart.append(Shop(_shop.shop_id, _shop.name, _shop.price, _count))

    # 删除库存
    if _shop.stock - _count > 0:
        _shop.stock = _shop.stock - _count
    else:
        _shop_list.remove(_shop)

# 退回购物车
def return_to_shop_cart(_shop_cart,_shop_list,_count,_shop):
    # 判断商品列表是否有当前商品
    commodity = False
    for item in _shop_list:
        if item.shop_id == _shop.shop_id:
            item.stock = item.stock + _count
            commodity = True
    # 加入商品列表
    if not commodity:
        # 如果没有当前商品
        _shop_list.append(Shop(_shop.shop_id, _shop.name, _shop.price, _count))

    # 删除库存
    if _shop.stock - _count > 0:
        _shop.stock = _shop.stock - _count
    else:
        _shop_cart.remove(_shop)


def apply_coupon(coupon, element, _money):
    if coupon.type == 'discount':
        total_price = element.price * (element.stock - 1) + element.price * coupon.discount
    else:
        total_price = element.price * element.stock + coupon.discount

    if _money >= total_price:
        _money -= total_price
        return True, _money
    else:
        print("余额不足，请充值")
        return False, _money


def checkout(_money, shopping_cart, bought_shop_list, coupon_cart):
    temp_coupon_cart = []
    temp_bought_shop_list = []
    __money = _money

    for element in shopping_cart:
        coupon_found = False
        for coupon in coupon_cart:
            if coupon.shop_id == element.shop_id:
                success, _money = apply_coupon(coupon, element, _money)
                if not success:
                    return _money
                temp_coupon_cart.append(coupon)
                temp_bought_shop_list.append(element)
                coupon_found = True
                break

        if not coupon_found:
            if _money >= element.price * element.stock:
                _money -= element.price * element.stock
                temp_bought_shop_list.append(element)
            else:
                print("余额不足，请充值")
                return __money

    # 更新已购商品列表和优惠券列表，并从购物车中移除商品
    for element in temp_bought_shop_list:
        bought_shop_list.append(element)
        shopping_cart.remove(element)
    for coupon in temp_coupon_cart:
        coupon_cart.remove(coupon)

    print_bought_shop_list(bought_shop_list)

    return _money


def print_bought_shop_list(bought_shop_list):
    sum = 0
    for shop in bought_shop_list:
        sum += shop.price * shop.stock
    print("###########################")
    print("#                         #")
    print("#         商店小票        #")
    for item in bought_shop_list:
        print("#  序号:%d 商品:%s 价格:%d 数量:%d  #" % (item.shop_id,item.name, item.price, item.stock))
    print("#                 总计:%d  #"%(sum))
    print("###########################")
    input("按任意键返回上一级\n")


def main(_money=200, _shop_list=None, _coupon_list=None):
    # 初始化优惠券列表
    if _coupon_list is None:
        _coupon_list = [
            Coupon('芒果8折优惠券', 1, 0.8, 'discount'),
            Coupon('苹果5.5折优惠券', 2, 0.55, 'discount'),
            Coupon('芒果3折优惠券', 1, 0.3, 'discount'),
            Coupon('凤梨8折优惠券', 3, 0.8, 'discount'),
            Coupon('酸奶5折优惠券', 7, 0.5, 'discount'),
            Coupon('面包1折优惠券', 8, 0.1, 'discount'),
            Coupon('芒果6折优惠券', 1, 0.6, 'discount'),
            Coupon('面包8折优惠券', 8, 0.8, 'discount'),
            Coupon('面包9折优惠券', 8, 0.9, 'discount'),
            Coupon('芒果3元优惠券', 1, 3, 'reduction'),
            Coupon('面包5元优惠券', 8, 5, 'reduction'),
            Coupon('酸奶15元优惠券', 7, 15, 'reduction')
        ]
    # 初始化商品列表
    if _shop_list is None:
        _shop_list = [
            Shop(1, '芒果', 10, 5),
            Shop(2, '苹果', 10, 10),
            Shop(3, '凤梨', 10, 3),
            Shop(4, '香蕉', 5, 10),
            Shop(5, '鸭梨', 10, 2),
            Shop(6, '牛奶', 15, 5),
            Shop(7, '酸奶', 20, 8),
            Shop(8, '面包', 10, 7)
        ]
    # 初始化购物车列表
    shopping_cart = []
    # 初始化优惠券
    coupon_cart = []
    # 初始化已购买商品列表
    bought_shop_list = []

    # 抽取优惠券
    extract_coupons(_coupon_list, coupon_cart)

    while True:
        # 打印首页
        operation = print_main(_money, coupon_cart)

        # 查看购物车
        if operation == '1':
            # 打印购物车列表
            print_shopping_cart(shopping_cart,_shop_list)
        if operation == '2':
            # 循环购买商品
            while True:
                item_id = int(print_shop_list(_shop_list))

                if item_id == 0:
                    # 退出购买
                    break
                elif [obj for obj in _shop_list if obj.shop_id == item_id]:
                    # 定义一个临时shop和coupon用来存储当前选择对象
                    _shop = {}
                    _coupon = {}
                    # 存入当前选择商品
                    for shop in _shop_list:
                        if shop.shop_id == int(item_id):
                            _shop = shop
                    for item in coupon_cart:
                        if item.shop_id == int(item_id):
                            _coupon = item
                    count = int(input("请输入你要购买的数量: "))
                    if count > _shop.stock:
                        print("对不起，商品库存不足")
                        input("按任意键返回上一级\n")
                        continue
                    # 加入购物车
                    add_to_shop_cart(_shop_list,_shop, shopping_cart, count)
                else:
                    print("对不起，没找到该商品")
                    input("按任意键返回上一级\n")
        if operation == '3':
             _money = checkout(_money, shopping_cart, bought_shop_list,coupon_cart)
        if operation == '0':
            print_exit()
            break


# 运行主函数
main()
